package queens.actions;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.validator.Resources;

import queens.beans.ClienteBean;
import queens.exceptions.QueensException;
import queens.facades.IClienteFacade;
import queens.forms.AltaClientesForm;
import queens.util.Constantes;

public class AltaClientesAction extends QueensAction {
	
	// log de la clase
	@SuppressWarnings("unused")
	private static Log log = LogFactory.getLog(AltaClientesAction.class);
	
	private IClienteFacade clienteFacade;
	
	private void inicializarFacades(){
		clienteFacade = (IClienteFacade)getBean("clienteFacade");
	}

	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception{
		
		ActionErrors errors               = (ActionErrors)request.getSession().getAttribute(Globals.ERROR_KEY);
		ActionMessages messages           = new ActionMessages();
		boolean errores                   = errors.size()>0;  
		AltaClientesForm altaClientesForm = (AltaClientesForm)form;
		inicializarFacades();
		
		// si hemos pedido una edición desde los resultados de busqueda
		if(((String)request.getParameter("editar") != null) && (((String)request.getParameter("editar")).equals("true"))){
			ClienteBean clienteBean = getClienteFacade().obtenerCliente(altaClientesForm.getClaveCliente()[0]);
			altaClientesForm.setClienteBean(clienteBean);
			altaClientesForm.setAccionSistema(Constantes.ACCION_SISTEMA_EDITAR_CLIENTE);
			return mapping.findForward("altaClientes");
		}
		
		if(!errores){
			if(Resources.getMessage(request,"guardar").equals(altaClientesForm.getAccion())){
				try{
					getClienteFacade().insertarCliente(altaClientesForm.getClienteBean());
					messages.add("insertado", new ActionMessage("cliente.insertado.correctamente"));
				}catch (Exception e) {
					if(e instanceof QueensException){
						if(((QueensException) e).getMensajePersonalizado().equals("existe.cliente.dni")){
							errors.add("error", new ActionError(((QueensException) e).getMensajePersonalizado()));
							errors.add("clienteBean.dni", new ActionError(""));
						}else if(((QueensException) e).getMensajePersonalizado().equals("existe.cliente.no.activo")){
							// cargamos el cliente no activo y lo damos para editar
							ClienteBean clienteBean = clienteFacade.obtenerCliente(altaClientesForm.getClienteBean().getDni());
							clienteBean.setActivo(Constantes.SI);
							altaClientesForm.setClienteBean(clienteBean);
							altaClientesForm.setAccionSistema(Constantes.ACCION_SISTEMA_EDITAR_CLIENTE);
							request.setAttribute("activarCliente", "activarCliente");
							return mapping.findForward("altaClientes");
						}
					}else{
						throw new Exception();
					}
				}
			}else if(Resources.getMessage(request,"editar").equals(altaClientesForm.getAccion())){
				getClienteFacade().editarCliente(altaClientesForm.getClienteBean());
				messages.add("editado", new ActionMessage("cliente.editado.correctamente"));
			}else if("".equals(altaClientesForm.getAccion())){
				altaClientesForm.setAccionSistema(Constantes.ACCION_SISTEMA_ALTA_CLIENTE);
			}else if(Resources.getMessage(request,"salir").equals(altaClientesForm.getAccion())){
				if(Constantes.ACCION_SISTEMA_EDITAR_CLIENTE.equals(altaClientesForm.getAccionSistema())){
					// a la pantalla de busqueda de clientes
					return mapping.findForward("buscarClientesAction");
				}else{
					return mapping.findForward("inicio");
				}
			}
		}

		saveMessages(request, messages);
		saveErrors(request, errors);
		return mapping.findForward("altaClientes");
		
	}

	protected IClienteFacade getClienteFacade() {
		return clienteFacade;
	}

}